[Home] Python으로 돌아가기

PART 03. 선택 구조

목차


🎯 학습 목표


3.1 비교 연산자

비교 연산자는 두 값의 크기/같음 여부를 비교하여 결과를 True(참) 또는 False(거짓)로 반환한다. 조건문(if)에서 가장 많이 사용된다.

✅ 주요 비교 연산자

연산자 의미 예시 결과
==같다3 == 3True
!=같지 않다3 != 2True
>크다5 > 2True
>=크거나 같다5 >= 5True
<작다1 < 0False
<=작거나 같다1 <= 1True
Tip: 비교 연산의 결과는 bool 타입이며, 출력하면 True/False로 보인다.

🎲 예제 1) 랜덤 숫자 맞히기

random 모듈의 randint(a, b)a부터 b까지(둘 다 포함) 정수 중 하나를 무작위로 선택한다.

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

import random

answer = random.randint(1, 5)
guess = int(input("1~5 사이 숫자를 맞혀 보세요: "))

print("정답:", answer)
print("내가 입력한 값:", guess)
print("맞혔나요?", answer == guess)
LAB 몫과 나머지 퀴즈 (힌트 포함)

랜덤으로 두 정수 a, b를 만든 뒤, a // b의 몫과 a % b의 나머지를 맞히는 퀴즈를 만들어 본다.

본 예제는 딕셔너리를 생성하고 키-값 쌍을 추가하거나 조회하는 기본 사용법을 보여 준다. 딕셔너리는 순서보다 ‘키를 통한 빠른 조회’에 강점이 있으므로, 항목 이름을 키로 삼는 상황에 적합하다.

import random

a = random.randint(10, 99)
b = random.randint(2, 9)

q = int(input(f"{a} ÷ {b} 의 몫은? "))
r = int(input(f"{a} ÷ {b} 의 나머지는? "))

real_q = a // b
real_r = a % b

print("정답(몫, 나머지):", real_q, real_r)
print("몫 정답 여부:", q == real_q)
print("나머지 정답 여부:", r == real_r)

3.2 선택 구조

🧩 프로그램 구조 3가지

1) if 문

if 문은 조건식이 참(True)일 때만 블록(들여쓰기 영역)을 실행한다. 조건식 뒤에는 콜론(:)을 붙이고, 실행할 문장은 반드시 들여쓰기(indentation)를 해야 한다.

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

temp = int(input("현재 온도를 입력하세요: "))
if temp < 0:
    print("영하입니다. 따뜻하게 입으세요!")

🎲 예제) 두 정수를 큰 수 → 작은 수 순으로 출력하기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

import random

a = random.randint(1, 100)
b = random.randint(1, 100)

# a가 b보다 작으면 서로 바꾸기
if a < b:
    a, b = b, a

print("큰 수:", a)
print("작은 수:", b)

2) if ~ else 문

조건이 참이면 문장1을, 거짓이면 문장2를 실행한다. else 뒤에는 조건식이 없고 콜론(:)만 있다.

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

height1 = int(input("학생 1의 키(cm): "))
height2 = int(input("학생 2의 키(cm): "))

if height1 >= height2:
    print("키 차이:", height1 - height2, "cm")
else:
    print("키 차이:", height2 - height1, "cm")

3) if ~ elif ~ else 문

여러 조건 중 하나를 선택해야 할 때 사용한다. 위에서부터 조건을 검사하며, 처음으로 True가 나온 블록만 실행한다. 모든 조건이 False이면 마지막 else 블록이 실행된다.

예제 놀이공원 입장료 계산

기본 입장료가 5,000원이고, 나이에 따라 할인율이 다를 때 입장료를 계산한다. (할인 기준은 수업 자료의 표를 그대로 반영해 코드로 옮기면 된다.)

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

fee = 5000
age = int(input("나이: "))

# 예시 할인 규칙(필요 시 수업 규칙에 맞게 수정)
if age < 8:
    fee *= 0.5   # 50% 할인
elif age < 14:
    fee *= 0.7   # 30% 할인
elif age < 65:
    fee *= 1.0   # 할인 없음
else:
    fee *= 0.6   # 40% 할인(경로 우대 예시)

print("입장료:", int(fee), "원")
LAB 10,000원 이상 구매하면 5% 할인

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

price = int(input("구매 금액(원): "))

if price >= 10000:
    price = int(price * 0.95)

print("최종 결제 금액:", price, "원")
LAB 짝수와 홀수 판별하기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

n = int(input("정수 입력: "))

if n % 2 == 0:
    print("짝수")
else:
    print("홀수")
LAB 주사위 굴리기 (큰 눈 판별)

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

import random

dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)

print("주사위1:", dice1, "주사위2:", dice2)

if dice1 > dice2:
    print("주사위1이 큽니다.")
elif dice1 < dice2:
    print("주사위2가 큽니다.")
else:
    print("같습니다.")
LAB 3개의 수 중 최솟값 찾기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

a = int(input("첫 번째 수: "))
b = int(input("두 번째 수: "))
c = int(input("세 번째 수: "))

m = a
if b < m:
    m = b
if c < m:
    m = c

print("가장 작은 수:", m)
자주 하는 실수
1) if 뒤에 콜론(:)을 빼먹는 경우
2) 들여쓰기가 맞지 않아 실행 오류가 나는 경우
3) == 대신 =을 쓰는 경우(대입 vs 비교)

3.3 논리 연산자

논리 연산자는 여러 개의 조건을 하나로 묶어 더 복잡한 조건식을 만들 때 사용한다.

✅ 주요 논리 연산자

연산자 의미 예시 설명
and 그리고(둘 다 True) age >= 20 and age < 30 두 조건이 모두 참일 때만 참
or 또는(하나라도 True) vip == "Y" or price >= 20000 둘 중 하나라도 참이면 참
not 부정 not (score < 60) 참↔거짓 반전

🛒 예제) 배송비 무료 조건 (or)

기본 배송비가 2,000원이고, 우수 고객이거나 2만 원 이상 구매하면 배송비가 무료라고 가정한다.

본 예제는 문자열 메서드를 활용하여 대소문자 변환, 부분 문자열 탐색, 구성 검증을 수행하는 방법을 보인다. 입력 문자열의 형태를 통일하거나(upper/lower), 포함 여부를 판정(find), 조건을 검사(isalnum, len)하는 흐름이 포함된다.

member = input("우수 고객인가요? (Y/N): ").strip().upper()
price = int(input("구매액(원): "))

shipping = 2000
if (member == "Y") or (price >= 20000):
    shipping = 0

print("배송비:", shipping, "원")
print("총 결제:", price + shipping, "원")

🔢 예제) 3의 배수이면서 5의 배수인가? (and)

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

n = int(input("정수 입력: "))

if (n % 3 == 0) and (n % 5 == 0):
    print("3과 5의 공배수입니다.")
else:
    print("공배수가 아닙니다.")
LAB 윤년 판별하기

윤년 규칙(그레고리력):
1) 4로 나누어떨어지고, 2) 100으로 나누어떨어지지 않거나, 3) 400으로 나누어떨어지면 윤년

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

year = int(input("연도 입력: "))

is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)

if is_leap:
    print("윤년")
else:
    print("평년")
LAB 가위바위보 게임 (결과 판별 로직)

사용자와 컴퓨터의 선택을 비교해 승/패/무를 판단한다. 핵심은 여러 경우의 수를 and/or로 묶는 것이다.

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

import random

choices = ["가위", "바위", "보"]
user = input("가위/바위/보 중 하나: ").strip()
computer = random.choice(choices)

print("컴퓨터:", computer)

if user == computer:
    print("무승부")
elif (user == "가위" and computer == "보") or      (user == "바위" and computer == "가위") or      (user == "보" and computer == "바위"):
    print("사용자 승")
else:
    print("컴퓨터 승")

3.4 함수

함수(function)는 특정 기능을 수행하도록 미리 만들어 둔 코드 묶음이다. 필요할 때마다 호출하여 사용할 수 있어 코드가 짧고 읽기 쉬워진다.

함수의 장점

함수 정의와 호출

함수는 정의(def)만 해서는 실행되지 않고, 반드시 호출(call)해야 실행된다.

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def hello():
    print("함수입니다.")

# 호출해야 실행됨
hello()

함수 형식 4가지

구분 형식 예시
매개변수 X, 반환값 X def f(): ... hello()
매개변수 O, 반환값 X def f(x): ... print_sum(2, 3)
매개변수 X, 반환값 O def f(): return ... x = get_pi()
매개변수 O, 반환값 O def f(x): return ... y = add(2, 3)

예제) 매개변수가 있고 반환값이 있는 add 함수

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def add(a, b):
    return a + b

result = add(10, 20)
print(result)

예제) 여러 개 값을 반환하기 (큰 수, 작은 수)

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def bigsmall(a, b):
    if a >= b:
        return a, b
    else:
        return b, a

big, small = bigsmall(7, 3)
print(big, small)
LAB 함수를 이용해서 사칙연산하기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def add(a, b): return a + b
def sub(a, b): return a - b
def mul(a, b): return a * b
def div(a, b): return a / b

x = float(input("x: "))
y = float(input("y: "))

print("add:", add(x, y))
print("sub:", sub(x, y))
print("mul:", mul(x, y))
print("div:", div(x, y))
LAB 함수 하나로 몫과 나머지 반환하기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def quotient_remainder(a, b):
    return a // b, a % b

a = int(input("a: "))
b = int(input("b: "))

q, r = quotient_remainder(a, b)
print("몫:", q)
print("나머지:", r)

3.5 [플러스 예제] 온도 변환기

섭씨 → 화씨, 화씨 → 섭씨

온도 변환은 공식만 정확히 적용하면 된다. 섭씨 → 화씨: F = C × 9/5 + 32
화씨 → 섭씨: C = (F - 32) × 5/9

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

def c_to_f(c):
    return c * 9 / 5 + 32

def f_to_c(f):
    return (f - 32) * 5 / 9

하나의 프로그램으로 묶기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

kind = input("온도 종류(섭씨/화씨): ").strip()
temp = float(input("온도 값: "))

if kind == "섭씨":
    print("화씨:", c_to_f(temp))
else:
    print("섭씨:", f_to_c(temp))
Tip: 입력을 더 안전하게 처리하려면 섭씨/화씨 외의 값이 들어오는 경우 안내 메시지를 출력하도록 elif/else를 추가해도 좋다.

3.6 [플러스 예제] 두 도형의 넓이 비교하기

사각형/삼각형/원 중 2개를 골라 넓이를 계산하고 더 큰 도형을 맞히는 게임을 예시로, 함수선택 구조를 함께 연습한다.

도형별 넓이 함수 만들기

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

import math

def square(w, h):
    return w * h

def triangle(b, h):
    return b * h / 2

def circle(r):
    return math.pi * r * r

입력값에 따라 적절한 함수를 호출하기

본 예제는 딕셔너리를 생성하고 키-값 쌍을 추가하거나 조회하는 기본 사용법을 보여 준다. 딕셔너리는 순서보다 ‘키를 통한 빠른 조회’에 강점이 있으므로, 항목 이름을 키로 삼는 상황에 적합하다.

def input_area(shape_type, idx):
    shape_type = shape_type.strip()

    if shape_type == "사각형":
        w = float(input(f"{idx}번째 사각형 가로: "))
        h = float(input(f"{idx}번째 사각형 세로: "))
        return square(w, h)

    elif shape_type == "삼각형":
        b = float(input(f"{idx}번째 삼각형 밑변: "))
        h = float(input(f"{idx}번째 삼각형 높이: "))
        return triangle(b, h)

    elif shape_type == "원":
        r = float(input(f"{idx}번째 원 반지름: "))
        return circle(r)

    else:
        raise ValueError("도형 종류는 사각형/삼각형/원 중 하나여야 한다.")

전체 흐름(간단 버전)

본 예제는 해당 단원에서 다루는 핵심 개념을 코드로 확인하기 위한 예시이다. 변수의 의미를 파악한 뒤, 입력·처리·출력의 흐름을 따라 실행 결과를 해석하는 것이 중요하다.

shape_type1 = input("첫 번째 도형(사각형/삼각형/원): ")
area1 = input_area(shape_type1, 1)

shape_type2 = input("두 번째 도형(사각형/삼각형/원): ")
area2 = input_area(shape_type2, 2)

print("1번 넓이:", area1)
print("2번 넓이:", area2)

if area1 > area2:
    print("1번 도형이 더 큽니다.")
elif area1 < area2:
    print("2번 도형이 더 큽니다.")
else:
    print("두 도형의 넓이가 같습니다.")
확장 아이디어